import { formatDate, formatDateString, GetScanDate } from './formatTime'


/**
 * 解析血袋条码
 * ABO和rhD血型码以=%开头
 * 血液产品码以=<开头
 * 献血码以=开头
 * 时间以&>
 * @param val 扫码获取到的信息
 * @returns message 是转换格式后的字符串，type是扫码的类型('rhD'-> rhD, 'effectiveDate' -> 有效期, 
 * 'basBloodProductCode' -> 血液产品, 'bloodDonationCode' -> 献血码, 'Code' -> 全码, 'BloodBag' -> 血袋号 )
 */
export function decodeXueDaiTiaoMa(val: string): { message: string, type: string, abo: string, rhD: string } {
  //得到流水
  let message = '' + val;
  /**
   *  正则表达式判断是否是血液类型（以=%开头，后面跟四位数字）。如果是血液类型，则返回血液类型信息。
   */
  let isXueXing = /^[=][%]\d{4}$/g;
  /**
   * 正则表达式判断是否是血液产品（以=<开头）。如果是血液产品，则返回血液产品信息
   */
  let isChanPinMa = /^[=][<]/g;
  /**
  * 献血码 {13}[5][5]
  * let isXianXueMa = /^[=]([\d]{13}|[\d]{15})$/g;
  * 判断是否是献血码（以=开头）。如果是献血码，则返回献血码信息
  */
  let isXianXueMa = /^[=]([\d]{13}|[\d]{15})$/g;
  /**
   *  判断是否是日期（以数字开头，后面跟11位数字）。如果是日期，则返回日期的格式化信息
   */
  let isDate = /^[1-9](\d){11}$/g
  /**
   *  判断是否是日期（以=>开头，后面跟11位数字）。如果是日期，则返回日期的格式化信息
   */
  let isDate2 = /^[=][>][1-9](\d){11}$/g;
  /**
   *  判断是否是日期（以&>开头，后面跟8位数字、字母、空格、T和4位数字）。如果是日期，则返回日期的格式化信息
   */
  let isDate3 = /^[&][>][\d]{8}T[\d]{4}$/g;
  /**
   *  判断是否是日期（以&>开头，后面跟10位数字）。如果是日期，则返回日期的格式化信息
   */
  let isDate4 = /^[&][>](\d){10}$/g
  /**
   * 判断是否是血液编号（13位或15位数字后面跟3位字母数字）。如果是血液编号，则返回血液编号信息
   */
  let isCode = /^([\d]{13}|[\d]{15})[a-zA-Z0-9]{3}/g;
  /**
   * 判断是否是主血袋（以= 13位数字 2 1开头）。如果是主血袋，则返回主血袋信息
   */
  let isZhuXueDai = /^[=][\d]{13}[2][1]$/g;
  /**
   *  返回信息，message 是转换格式后的字符串，type是扫码的类型
   */
  let entity = {
    message: '请扫描正确的条码!',
    type: 'error',
    abo: '',
    rhD: '',
  }

  if (isXueXing.test(message) === true) {
    //查询得到血液类型
    let reg = /^[=][%]/g
    let BoolType = message.replace(reg, "")
    let xueXing = bloodTypeCodeComparison(BoolType)
    entity.abo = xueXing.abo;
    entity.rhD = xueXing.rhD;
    entity.type = "XueXing"
  } else if (isDate.test(message) === true) {
    //有效期 11 位数字
    let datetime = formatDateString(message)
    let date = new Date(datetime);
    //有效日期-保质日期=采血日期
    let shiXiaoShiJian = formatDate(date, "YYYY-mm-dd HH:MM")
    entity.message = shiXiaoShiJian
    entity.type = "shiXiaoShiJian"
  }
  else if (isDate2.test(message) === true) {
    //有效期2
    let reg = /^[=][>]/g
    let datetime = formatDateString(message.replace(reg, ""))
    let date = new Date(datetime);
    //有效日期-保质日期=采血日期
    let shiXiaoShiJian = formatDate(date, "YYYY-mm-dd HH:MM")
    entity.message = shiXiaoShiJian
    entity.type = "shiXiaoShiJian"
  }
  else if (isDate3.test(message) === true) {
    //有效期3
    let reg = /^[&][>]/g
    let datetime = message.replace(reg, "")
    datetime = formatDateString(message.replace('T', ""))
    let date = new Date(datetime);
    //有效日期-保质日期=采血日期
    let shiXiaoShiJian = formatDate(date, "YYYY-mm-dd HH:MM")
    entity.message = shiXiaoShiJian
    entity.type = "shiXiaoShiJian"
  } else if (isDate4.test(message) === true) {
    let reg = /^[&][>]/g
    let datetime: string = message.replace(reg, "")
    //有效日期-保质日期=采血日期
    let shiXiaoShiJian = GetScanDate(datetime);
    entity.message = shiXiaoShiJian
    entity.type = "shiXiaoShiJian"
  }
  else if (isChanPinMa.test(message) === true) {
    //产品码
    let reg = /^[=][<]/g
    let chanPinId = message.replace(reg, "")
    entity.message = chanPinId
    entity.type = "chanPinId"
  }
  else if (isXianXueMa.test(message) === true) {
    //献血码
    let reg = /^[=]/g
    entity.message = message.replace(reg, "")
    entity.type = "xianXueMa"
  } else if (isCode.test(message) === true) {
    //血液编号
    entity.message = message
    entity.type = "Code"
  } else if (isZhuXueDai.test(message) === true) {
    //血袋号
    let reg = /^[=]/g
    entity.message = message.replace(reg, "")
    entity.type = "BloodBag"
  } else {
    entity.message = '请扫描正确的条码!'
    entity.type = 'error'
  }
  return entity
}


/*血液扫码流程getBarcode: 获取扫码信息方法bloodTypeCodeComparison：根据血液代码，获取血型*/
const bloodTypeCodeComparison = (code: string) => {
  const comparisonList = [
    { code: '0600', abo: 'A', rhD: '-' },
    { code: '1700', abo: 'B', rhD: '-' },
    { code: '2800', abo: 'AB', rhD: '-' },
    { code: '5100', abo: 'O', rhD: '+' },
    { code: '5500', abo: 'O', rhD: '' },
    { code: '6200', abo: 'A', rhD: '+' },
    { code: '6600', abo: 'A', rhD: '' },
    { code: '7300', abo: 'B', rhD: '+' },
    { code: '7700', abo: 'B', rhD: '' },
    { code: '8400', abo: 'AB', rhD: '+' },
    { code: '8800', abo: 'AB', rhD: '' },
    { code: '9500', abo: 'O', rhD: '-' },
  ];
  const result = comparisonList.find((item) => item.code == code);
  if (result) {
    return result;
  } else {
    return { abo: '', rhD: '' };
  }
};